package com.yunhe.authority.service.base;

import com.yunhe.common.model.PageParam;
import com.yunhe.authority.domain.base.Area;
import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.exception.ObjectNotFoundException;
import com.yunhe.common.exception.UniqueConstraintsException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Optional;

/**
 * 地区Service
 * @desc 地区服务类定义
 * @author liuronglei
 */
@Service
public interface AreaService {

    /**
     * 新增地区
     * @param area 新增对象
     */
    @Transactional
    Area createArea(Area area, Long parentId)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 批量新增地区
     * @param list 地区列表
     */
    @Transactional
    Iterable<Area> createArea(List<Area> list)
            throws ArgumentErrorException, UniqueConstraintsException;

    /**
     * 根据id删除地区
     * @param areaId id
     */
    @Transactional
    void deleteArea(Long areaId);

    /**
     * 根据地区代码删除地区
     * @param code 地区代码
     */
    @Transactional
    Long deleteAreaByCode(Long code);

    /**
     * 根据地区编号删除地区
     * @param name 地区编号
     */
    @Transactional
    Long deleteAreaByName(String name);

    /**
     * 更新地区（更新全部字段）
     * @param area 要更新的地区对象
     */
    @Transactional
    Area updateArea(Area area)
            throws ArgumentErrorException, UniqueConstraintsException, ObjectNotFoundException;

    /**
     * 更新地区（更新指定字段）
     * @param areaId id
     * @param code 地区代码
     * @param name 地区编号
     * @param title 地区标题
     * @param adminArea 行政区
     */
    @Transactional
    Area updateArea(Long areaId,
                    Long code,
                    String name,
                    String title,
                    String adminArea,
                    Long parentId)
            throws ArgumentErrorException, ObjectNotFoundException, UniqueConstraintsException;

    /**
     * 根据ID获得地区对象
     * @param id id
     */
    Area findByAreaId(Long id);

    /**
     * 根据地区代码获得地区对象
     * @param code 地区代码
     */
    Area findByCode(Long code);

    /**
     * 根据地区编号获得地区对象
     * @param name 地区编号
     */
    Area findByName(String name);

    /**
     * 根据地区标题获得地区对象
     * @param title 地区标题
     */
    Area findByTitle(String title);

    /**
     * 获得有单位关联的地区对象
     */
    Iterable<Area> findFirmAreas();

    /**
     * 根据单位代码获得单位关联的地区对象
     * @param firmCode 单位代码
     */
    Area findFirmArea(Long firmCode);

    /**
     * 获得所有地区对象
     * @param pageParam 分页对象
     */
    Iterable<Area> findAreas(PageParam pageParam);

    /**
     *根据单位获得所属地区
     * @param firmId 单位ID
     */
    Iterable<Area> findAreaByFirmId(Long firmId);

    Area findByStationCode(Long stationCode);
}
